// 环境变量中的TARGET属性，可以知道当前要打包的模块是哪个，就可以获取对于模块的package.json
// console.log('rollup', process.env.TARGET);

import path from 'path';
import json from '@rollup/plugin-json';
import resolvePlugin from '@rollup/plugin-node-resolve';
import ts from 'rollup-plugin-typescript2';

// 找到pakages的绝对路径 => /Users/zhangxiaodong/Documents/my-project/vue3/packages
const packagesDir = path.resolve(__dirname, 'packages');

// 找到要打包的某个包 （packageDir是打包模块的基准目录）
// packageDir => /Users/zhangxiaodong/Documents/my-project/vue3/packages/reactivity
const packageDir = path.resolve(packagesDir, process.env.TARGET);

// 找到当前模块目录下的package.json
const resolve = (p) => path.resolve(packageDir, p);
const pkg = require(resolve('package.json')); // package.json文件
const name = path.basename(packageDir); // reactivity、shared

// 对打包类型先做一个映射表，根据你提供的formats来格式化要打包的内容
const outputConfig = {
    'esm-bundler': { // 打包输出esModule规范，打包到dist文件夹下
        file: resolve(`dist/${name}.esm-bundler.js`),
        formats: 'es'
    },
    'cjs': { // 打包输出commonJS规范，打包到dist文件夹下
        file: resolve(`dist/${name}.cjs.js`),
        formats: 'cjs'
    },
    'global': { // 打包输出自执行函数，打包到dist文件夹下
        file: resolve(`dist/${name}.global.js`),
        formats: 'iife'
    }
}

// package.json中定义的
const options = pkg.buildOptions;

// 创建rollup配置
function createConfig(format, output) {
    output.name = options.name; // VueReactivity VueShared
    output.sourcemap = true; // 生成sourcemap，便于调试
    // 生成rollup配置
    return {
        input: resolve('src/index.ts'),
        output,
        plugins: [  // 插件是有顺序的，从上到下，依次执行
            json(), // 解析json
            ts({    // 解析ts
                tsconfig: path.resolve(__dirname, 'tsconfig.json')
            }),
            resolvePlugin() // 解析第三方模块
        ]
    }
}

// 导出打包配置（rollup最终需要导出配置）
// 根据不同模块的package.json中定义的需要打包出哪几种规范，进行过滤
const rollupConfig = options.formats.map(format => createConfig(format, outputConfig[format]));
export default rollupConfig;
